package cn.merryyou.logback.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;

/**
 * @Author: gongtao
 * @Date: Created in 2018/6/1 16:43
 * @Description: 资源服务器配置，可以分开部署也可以和授权服务器部署再同一个应用中。
 * 主要是提供对受token令牌保护的api资源， 这个api资源和本应用中的资源是不同的，也就是说本应用中的资源
 * 登录后根据角色权限即可实现访问，而受token保护的api资源只能提供给第三方通过提供token来请求获取资源
 *
 * 使用 @EnableResourceServer 注解之后呢(并配合@Configuration注解)，再创一个继承了 ResourceServerConfigurerAdapter
 * 的配置类，并且重写 ResourceServerConfigurerAdapter 的方法进行客制化的配置。
 *
 * 遇到的问题，
 *  由于默认的 Spring Security 的拦截器优先级高于 Spring Security OAuth2 的拦截器，导致受token保护的api资源
 *  在用户登陆之后可访问，即 Spring Security OAuth2的拦截器没有起到效果，将 Spring Security OAuth2 的拦截器优先级配置高于 Spring Security 的拦截器即可
 *      主要是这个两个类：
 *          WebSecurityConfigurerAdapter  是默认情况下 Spring Security 的 http 配置
 *          ResourceServerConfigurerAdapter  是默认情况下 Spring Security OAuth2 的 http 配置
 *
 *
 *
 *
 */

@Configuration
@EnableResourceServer   // 添加该注解将自动添加一个 OAuth2AuthenticationProcessingFilter 的过滤器链，还要配置他的优先级，要保证它在默认的security多滤器之前，配置的位置在 application.yml 中
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {


    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
        .requestMatchers().antMatchers("/me")
        .and()
        .authorizeRequests()
        .antMatchers("/me").access("#oauth2.hasScope('read')");// 指定客户端的访问范围
    }

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.resourceId("apis");
    }

}
